/**
 * 
 */
package com.flux.tms.tm${bean.numMain}srv.t${bean.numMain}${bean.numSub}.impl.ctrl;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.UncategorizedSQLException;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.flux.tms.tm${bean.numMain}srv.t${bean.numMain}${bean.numSub}.${bean.javaFlieName}CVal;
import com.flux.tms.tm${bean.numMain}srv.t${bean.numMain}${bean.numSub}.impl.service.Add${bean.javaFlieName}Service;
import com.flux.scev6.constant.CommonCVal;
import com.flux.scev6.utils.datetime.DateTimeUtil;
import com.flux.scev6.appsecret.AppSecretService;
import com.flux.scev6.dbopr.model.ResultObj;
import com.flux.scev6.exception.RowDataException;
import com.flux.scev6.extendopr.api.StdBizExtExecuteService;
import com.flux.scev6.function.functionhelper.BizHelper;
import com.flux.scev6.function.functionhelper.SFHelper;
import com.flux.scev6.log.biz.LogBatchNoUtil;
import com.flux.scev6.log.log4j.LogService;
import com.flux.scev6.login.LoginInfoBasicChecker;
import com.flux.scev6.login.LoginInfoUtil;
import com.flux.scev6.login.model.LoginInfoObj;
import com.flux.scev6.ons.OnsProducer;
import com.flux.scev6.ons.model.OnsMessageObj;
import com.flux.scev6.utils.*;


/**
 * 
 * T${bean.numMain}${bean.numSub} ${bean.notesSub} -- ${bean.numSub}   -- srv 新增数据 控制层实现
 * 
 * T${bean.numMain}${bean.numSub} ${bean.notesSub}
 * 
 * <p>
 * 创建时间：${bean.dayTime}
 * <p>
 * 
 * <p>
 * 修改时间：${bean.dayTime}
 * <p>
 * 
 * @author ${bean.author}
 * 
 * @version V1.0.0
 *
 */
@Component
public class Add${bean.javaFlieName}ServiceCtrl {

	/**
	 * V100(${bean.numTime}) ${bean.author} 初版。
	 */
	private static String verNum = "V100(${bean.numTime})";// 版本号

	@Autowired
	private AppSecretService appSecretService;
	
	@Autowired
	private Add${bean.javaFlieName}Service add${bean.javaFlieName}Service;
	@Autowired
	private OnsProducer onsProducer;
	@Autowired
    private StdBizExtExecuteService stdBizExtExecuteService;

	/*
	 * 日志 logger 名称
	 */
	private static String loggerName = ${bean.javaFlieName}CVal.LOGGER_NAME;

	/**
	 *  添加 一条  ${bean.notesSub} 数据
	 * 
	 * @date ${bean.dayTime}
	 * 
	 * @param loginInfo  登录信息
	 * @param bizData  提交参数 
	 * @return
	 */
	public String doAction(String loginInfo, String bizData) {
		String appSecret = appSecretService.getAppSecret();
		ResultObj resultObj = doAction(loginInfo, bizData, appSecret);
		
		resultObj.setEndTime();// 设置结束时间
		String resultString = ResultObjUtil.toJSONString(resultObj, appSecret);
		//System.out.println(resultString);
		if (LogService.isInfoEnabled(loggerName)) {
			StringBuffer logBuff = new StringBuffer(200);
			logBuff.append(DateTimeUtil.getCurrentTime());
			logBuff.append(" Add${bean.javaFlieName}ServiceCtrl info: [\r\n");
			logBuff.append("loginInfo: ").append(loginInfo).append("\r\n");
			logBuff.append("  bizData: ").append(bizData).append("\r\n");
			logBuff.append("   result: ").append(resultString).append("\r\n");
			logBuff.append("] ================================================ end.");
			LogService.info(loggerName, logBuff.toString());
		}
		return resultString;
	}

	/**
	 *  添加 一条  ${bean.notesSub} 数据  具体实现
	 * 
	 * @date ${bean.dayTime}
	 * 
	 * @param loginInfo  登录信息
	 * @param bizData  提上参数 
	 * @return
	 */
	private ResultObj doAction(String loginInfo, String bizData, String appSecret) {
		// ==================================================================================
				// ==================================================================================
				// ==================================================================================
				ResultObj resultObj = new ResultObj();
				Map<String,String> bizDataMap = null;
				resultObj.setVerNum(verNum);// 设置当前处理程序的版本号
				// 转换输入的登录信息数据格式
				LoginInfoObj loginInfoObj = LoginInfoUtil.fromJSONString(loginInfo, appSecret);
				try {
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					String responseId = ResponseIdUtil.createId(${bean.javaFlieName}CVal.FUNC_ID);// 响应Id
					resultObj.setResponseId(responseId);// 设置响应Id
					resultObj.setLogBatchNo(LogBatchNoUtil.createId(${bean.javaFlieName}CVal.FUNC_ID));// 设置日志批次号
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					// 基本数据检查
					String[] wantCheckIds = { CommonCVal.KEYNAME_DATASIGNATURE, CommonCVal.KEYNAME_USERID,
							CommonCVal.KEYNAME_REMOTE_CLIENT_ADDR, CommonCVal.KEYNAME_REQUESTID  };
					String checkResult = LoginInfoBasicChecker.check1(loginInfoObj, wantCheckIds);
					if (checkResult != null) {
						resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + checkResult);
						resultObj.setCodeValueERR();
						return resultObj;
					}
					// 请求Id
					resultObj.setRequestId(loginInfoObj.getRequestId());
					// 日志批次号
					if (loginInfoObj.getLogBatchNo() != null && loginInfoObj.getLogBatchNo().trim().length() >= 0) {
						// 如果调用者传入了 日志批次号 ，则使用调用者的 日志批次号
						resultObj.setLogBatchNo(loginInfoObj.getLogBatchNo());
					}
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					// 这里暂时不增加用户操作权限检查，检查逻辑放在前端应用层。
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					// 转换输入的业务数据格式
					bizDataMap = BizDataUtil.fromJSONString(bizData, appSecret);
					// // 基本数据检查
					 String[] wantCheckIdsForBizData = {
						 CommonCVal.KEYNAME_DATASIGNATURE,
						<#if (bean.pk01)!="">
							${bean.javaFlieName}CVal.KEYNAME_${(bean.pk01) ?upper_case}</#if><#if (bean.pk02)!="">,
							${bean.javaFlieName}CVal.KEYNAME_${(bean.pk02) ?upper_case}</#if><#if (bean.pk03)!="">,
							${bean.javaFlieName}CVal.KEYNAME_${(bean.pk03) ?upper_case}</#if><#if (bean.pk04)!="">,
							${bean.javaFlieName}CVal.KEYNAME_${(bean.pk04) ?upper_case}</#if><#if (bean.pk05)!="">,
							${bean.javaFlieName}CVal.KEYNAME_${(bean.pk05) ?upper_case}</#if><#if (bean.pk06)!="">,
							${bean.javaFlieName}CVal.KEYNAME_${(bean.pk06) ?upper_case}</#if>
					 };
					 String[] bizDataCheckResult = BizDataBasicChecker.check1(bizDataMap, wantCheckIdsForBizData);
					 if (bizDataCheckResult != null) {
						 resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID +
						 bizDataCheckResult[0]);
						 resultObj.setMessage(bizDataCheckResult[1]);
						 resultObj.setCodeValueERR();
						 return resultObj;
					 }
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					// 简单数据处理
					 String ${bean.pk01} = bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk01) ?upper_case});
					 ${bean.pk01} = ${bean.pk01}.trim().toUpperCase();// 去空格、转大写处理
					 String ${bean.pk02} = bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk02) ?upper_case});
					 ${bean.pk02} = ${bean.pk02}.trim().toUpperCase();// 去空格、转大写处理
					<#if (bean.pk03)!="">
					 String ${bean.pk03} = bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk03) ?upper_case});
					 ${bean.pk03} = ${bean.pk03}.trim().toUpperCase();// 去空格、转大写处理
					</#if>
					<#if (bean.pk04)!="">
						String ${bean.pk04} = bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk04) ?upper_case});
						${bean.pk04} = ${bean.pk04}.trim().toUpperCase();// 去空格、转大写处理
					</#if>
					<#if (bean.pk05)!="">
						String ${bean.pk05} = bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk05) ?upper_case});
						${bean.pk05} = ${bean.pk05}.trim().toUpperCase();// 去空格、转大写处理
					</#if>
					// 检查是否包含特殊字符
					 boolean isValid = StringUtil.isValidId(${bean.pk01});
					 boolean isValid2 = StringUtil.isValidId(${bean.pk02});
					<#if (bean.pk03)!="">
					 boolean isValid3 = StringUtil.isValidId(${bean.pk03});
					</#if>
					<#if (bean.pk04)!="">
						boolean isValid4 = StringUtil.isValidId(${bean.pk04});
					</#if>

					 if (!isValid) {
						// 包含了不支持的字符
						 resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID +
						 CommonCVal.ERRID_309);
						 resultObj.setCodeValueERR();
						 resultObj.setMessage(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk01) ?upper_case});
						 return resultObj;
					 }
					 if (!isValid2) {
							// 包含了不支持的字符
							 resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID +
							 CommonCVal.ERRID_309);
							 resultObj.setCodeValueERR();
							 resultObj.setMessage(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk02) ?upper_case});
							 return resultObj;
					}
				<#if (bean.pk03)!="">
					if (!isValid3) {
					// ${bean.pk03}包含了不支持的字符
					resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID +
					CommonCVal.ERRID_309);
					resultObj.setCodeValueERR();
					resultObj.setMessage(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk03)?upper_case});
					return resultObj;
					}
				</#if>
				<#if (bean.pk04)!="">
					if (!isValid4) {
					// ${bean.pk04}包含了不支持的字符
					resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID +
					CommonCVal.ERRID_309);
					resultObj.setCodeValueERR();
					resultObj.setMessage(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk04)?upper_case});
					return resultObj;
					}
				</#if>
					bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk01) ?upper_case}, ${bean.pk01});
					bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk02) ?upper_case}, ${bean.pk02});
					<#if (bean.pk03)!="">
					bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk03) ?upper_case}, ${bean.pk03});
					</#if>
				<#if (bean.pk04)!="">
					bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk04) ?upper_case}, ${bean.pk04});
				</#if>
					resultObj.setPkey01(${bean.pk01});// 记录PKey值返回给调用者使用
					resultObj.setPkey02(${bean.pk02});// 记录PKey值返回给调用者使用
				<#if (bean.pk03)!="">
					resultObj.setPkey03(${bean.pk03});// 记录PKey值返回给调用者使用
				</#if>
				<#if (bean.pk04)!="">
					resultObj.setPkey04(${bean.pk04});// 记录PKey值返回给调用者使用
				</#if>

					bizDataMap.put(CommonCVal.KEYNAME_CURRENT_VERSION, "100");// 当前版本号
					String oprSeqFlag = bizDataMap.get(CommonCVal.KEYNAME_OPRSEQFLAG);
					if (oprSeqFlag == null || oprSeqFlag.trim().length() <= 0) {
						// 没有设置操作流水标记
						bizDataMap.put(CommonCVal.KEYNAME_OPRSEQFLAG, responseId);// 操作流水标记
					}
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					// 调用标准业务功能扩展逻辑 - 前置操作
					String functionId = ${bean.javaFlieName}CVal.FUNC_ID;
					String actionCode = "ADD"; // 默认使用 BSM_FUNCTION_ACTION.actionId 的值
					String extendType = CommonCVal.STDBIZ_EXT_TYPE_PRE; // 前置操作
					ResultObj resultObj_ext = stdBizExtExecuteService.execute(loginInfoObj, bizDataMap, functionId, actionCode,
							extendType);
					if (resultObj_ext.isCodeValueERR()) {
						// 前置操作执行失败
						resultObj.setMessageId(resultObj_ext.getMessageId());
						resultObj.setMessage(resultObj_ext.getMessage());
						resultObj.setCodeValueERR();
						return resultObj;
					}
					// // 查询对应的记录是否存在
					 Map<String, Object> ${(bean.javaFlieName) ?lower_case}Map =
					 add${bean.javaFlieName}Service.get${bean.javaFlieName}(loginInfoObj,
					 bizDataMap);
					 if (${(bean.javaFlieName) ?lower_case}Map != null && ${(bean.javaFlieName) ?lower_case}Map.size() > 0) {
						 // 计划新增的多角色记录已经存在
						 resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID +
						 CommonCVal.ERRID_302);
						 resultObj.setOprSeqFlag01(SFHelper.getValueToStrFStrM(${(bean.javaFlieName) ?lower_case}Map,CommonCVal.KEYNAME_OPRSEQFLAG));
						 resultObj.setPkey10(CommonCVal.ACT_IMP);
						 resultObj.setCodeValueERR();
						 return resultObj;
					 }
		<#if (bean.systemCodeList)?size !=0>
				<#list (bean.systemCodeList)! as codeBean>
					<#if (codeBean.codeId)!="activeFlag">
					//检查对应的系统代码是否存在  ${codeBean.codeId}
					String ${codeBean.codeId} =  bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(codeBean.codeId) ?upper_case});
					if(${codeBean.codeId}!=null&&!"".equals(${codeBean.codeId})){
						${codeBean.codeId} = ${codeBean.codeId}.trim().toUpperCase();
						Map<String, Object> ${codeBean.codeId}Map = add${bean.javaFlieName}Service.getSystemCode(loginInfoObj, bizDataMap,
					${codeBean.codeId},${bean.javaFlieName}CVal.${codeBean.codeType});
						if (${codeBean.codeId}Map == null || ${codeBean.codeId}Map.size() <= 0) {
							// 业务数据${codeBean.codeId}-必需的字段值不存在或无效
							resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_208);
							resultObj.setCodeValueERR();
							resultObj.setMessage(${bean.javaFlieName}CVal.${(codeBean.codeType) ?upper_case});
							return resultObj;
						}
					}<#if !(codeBean.allowNull)>
					else{
						resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_200);
						resultObj.setCodeValueERR();
						resultObj.setMessage(${bean.javaFlieName}CVal.${(codeBean.codeType) ?upper_case});
						return resultObj;
					}</#if>
					</#if>
				</#list>
		</#if>
			<#if (bean.tableListStr)?contains("activeFlag")>
					// 活动标记
				String _FieldName ;
				String _FieldValue ;
					_FieldName = "activeFlag";
					_FieldValue = bizDataMap.get(_FieldName);
					if( _FieldValue!=null&&!"".equals(_FieldValue)){
						if (!"N".equalsIgnoreCase(_FieldValue)&&!"Y".equalsIgnoreCase(_FieldValue)) {
							// 业务数据-必需的字段值不存在或无效
							resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_208);
							resultObj.setCodeValueERR();
							resultObj.setMessage("activeFlag");
							return resultObj;
						}
					}else{
						bizDataMap.put(_FieldName,"Y");
					}
		</#if>
		<#if (bean.otherCodeList)?size !=0>
			<#list (bean.otherCodeList)! as otherTableBean>
					//检查对应的${otherTableBean.codeId}是否存在  ${otherTableBean.codeId}
					String  ${otherTableBean.codeId} =  bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(otherTableBean.codeId) ?upper_case});

					if( ${otherTableBean.codeId}!=null&&!"".equals(${otherTableBean.codeId})){
						Map<String, Object> ${otherTableBean.codeName}Map = add${bean.javaFlieName}Service.get${(otherTableBean.codeName)?cap_first}(loginInfoObj, bizDataMap,
						"");
						if (${otherTableBean.codeName}Map == null || ${otherTableBean.codeName}Map.size() <= 0) {
							// 业务数据-必需的字段值不存在或无效
							resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_208);
							resultObj.setCodeValueERR();
							resultObj.setMessage(${bean.javaFlieName}CVal.KEYNAME_${(otherTableBean.codeId) ?upper_case});
							return resultObj;
						}
					}<#if !(otherTableBean.allowNull)>else{
					// 业务数据-必需的字段值不存在或无效
						resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_200);
						resultObj.setCodeValueERR();
						resultObj.setMessage(${bean.javaFlieName}CVal.KEYNAME_${(otherTableBean.codeId) ?upper_case});
						return resultObj;
					}</#if>
			</#list>
		</#if>

					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					// 提交数据 (这里的所有操作放在一个事务中，如果没有异常则提交成功，否则提交失败，事务回滚)
					try {
						ResultObj resultObjTmp = add${bean.javaFlieName}Service.postData(loginInfoObj, bizDataMap);

						if (resultObjTmp.isCodeValueERR()) {
							resultObj.setMessageId(resultObjTmp.getMessageId());
							resultObj.setMessage(resultObjTmp.getMessage());
							resultObj.setCodeValueERR();
							return resultObj;
						}
					} catch (RowDataException rowDataException) {
						resultObj.setMessageId(rowDataException.getMessageId());
						resultObj.setMessage(rowDataException.getMessage());
						resultObj.setExceptionString(rowDataException);
						resultObj.setCodeValueERR();
						return resultObj;
					} catch (Exception err1) {
						resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_801);
						resultObj.setMessage(err1.getMessage());
						resultObj.setExceptionString(err1);
						resultObj.setCodeValueERR();
						return resultObj;
					}
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					// 20180112 zhadc 调用标准业务功能扩展逻辑 - 后置操作
					extendType = CommonCVal.STDBIZ_EXT_TYPE_POST; // 后置操作
					resultObj_ext = stdBizExtExecuteService.execute(loginInfoObj, bizDataMap, functionId, actionCode,
							extendType);
					if (resultObj_ext.isCodeValueERR()) {
						// 后置操作执行失败
						resultObj.setMessageId(resultObj_ext.getMessageId());
						resultObj.setMessage(resultObj_ext.getMessage());
						resultObj.setCodeValueERR();
						return resultObj;
					}
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					// 操作成功
					resultObj.setCodeValueOK();
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
				} catch (UncategorizedSQLException err) {
					//err.printStackTrace();
					BizHelper.setFinalRetInfo(resultObj, err,${bean.javaFlieName}CVal.FUNC_ID,loginInfoObj);
					resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_800);
					resultObj.setMessage(err.getMessage());
					resultObj.setExceptionString(err);
					resultObj.setCodeValueERR();
				} catch (Exception err) {
					//err.printStackTrace();
					BizHelper.setFinalRetInfo(resultObj, err,${bean.javaFlieName}CVal.FUNC_ID,loginInfoObj);
					resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_300);
					resultObj.setMessage(err.getMessage());
					resultObj.setExceptionString(err);
					resultObj.setCodeValueERR();
				} finally {
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					if (bizDataMap != null) {
						// 20180112 zhadc 因为调用标准业务扩展功能可能会改写 bizDataMap 业务数据表的相关字段值
						// 所以为了记录最终的数据表信息供分析使用，这里重新生成JSON字符串。
						bizData = JSON.toJSONString(bizDataMap);
					}
					// ==================================================================================
					// ==================================================================================
					// ==================================================================================
					try {
						// 发送一条日志消息
						resultObj.setEndTime();// 设置结束时间
						String resultString = ResultObjUtil.toJSONString(resultObj, appSecret);
						OnsMessageObj onsMessageObj = new OnsMessageObj(loginInfo, bizData, resultString);
						String tags = ${bean.javaFlieName}CVal.FUNC_ID;
						String key = resultObj.getResponseId();
						onsMessageObj.setTags(tags);// 设置tags值
						onsMessageObj.setKey(key);// 设置key值
						String onsMessageId = onsProducer.sendMessage(onsMessageObj.toJSONString(), tags, key);
						resultObj.setOnsMessageId(onsMessageId);// 记录 ONS
																// 返回的消息Id，后面会记录到日志文件中
					} catch (Exception err) {
						err.printStackTrace();
					}
				}
				return resultObj;// ==================================================================================
		// ==================================================================================
	}

}
